package com.prsistema.Vendas;

import com.prsistema.utilitarias.Item;
import com.prsistema.utilitarias.Venda;
import com.prsistema.DAO.Conexao;
import com.prsistema.DAO.DAOProduto;
import com.prsistema.Estaticos.MetodosStaticos;
import com.prsistema.utilitarias.Produto;
import java.awt.Color;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Calendar;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.SpinnerNumberModel;

public class RealizaVenda extends javax.swing.JPanel {

    private DAOProduto daoProd;
    private Venda venda;// Objeto que guarda todas as informações da venda
    private ArrayList<Produto> listaProdutos;//Lista de produtos cadastrados
    private static float UNIDADE_INICIAL_VALOR_REAIS = 0;
    //Constantes para minimo e maximo de unidades (jSpinner)
    private static final int UNIDADE_INICIAL = 0;//Usada também para iniciar valor de item
    private static final int UNIDADE_MINIMO = 0;
    private static final int UNIDADE_MAXIMO = 100000;
    private static final int UNIDADE_INCREMENTO = 1;
    private static final String urlLabelIcon = "/com/prsistema/ImagensIcones/labels/";
    
    private float subTotal; //variavel que armazena os subTotais do item quando selecionado
    private long unidades; //variavel que armazena as unidades do item quando selecionado
    
    //Usado para modificar o formato dos preços, tirando o ponto e colocando a vírgula
    //Também faz com que mostre apenas duas casa descimais
    NumberFormat formato = new DecimalFormat("0.00");

    /** Creates new form RealizaVenda */
    public RealizaVenda(Conexao con) {
        this.daoProd = new DAOProduto(con.getConector());
        this.venda = new Venda();
        this.listaProdutos = new ArrayList<Produto>();

        initComponents();

        //Preenchendo campos iniciais
        this.carregarProdutos();

        //Data atual
        this.txtDia.setText(String.valueOf(venda.getData().get(Calendar.DAY_OF_MONTH)));
        this.txtMes.setText(String.valueOf(venda.getData().get(Calendar.MONTH) + 1));
        this.txtAno.setText(String.valueOf(venda.getData().get(Calendar.YEAR)));

        //Iniciando os campos de valor total, subtotal e unidades total como zero
        this.txtValorTotal.setText(String.valueOf(UNIDADE_INICIAL_VALOR_REAIS));
        this.txtSubTot.setText("R$ " + this.formato.format(UNIDADE_INICIAL_VALOR_REAIS));
        this.txtUniTotal.setText(String.valueOf(UNIDADE_INICIAL));
    }

    //Método que carrega do banco todos os produtos e os mostram nas listas
    //Também inicializa todos os itens da venda
    public void carregarProdutos() {
        this.listaProdutos = this.daoProd.selectAll();
        
        this.limpaCampos();
        for (int i = 0; i < this.listaProdutos.size(); i++) {

            //Passando produto do arrayList para variavel p para limpar código
            Produto p = this.listaProdutos.get(i);

            //Iniciando os itens com valor 0 de unidades e subTotal, e também passando id do produto para identificação
            Item it = new Item();
            it.setIdProduto(p.getId());
            it.setQnt(UNIDADE_INICIAL); 
            it.setSubTotal(UNIDADE_INICIAL);
            this.venda.listaItens.add(it); //Adicionando item a lista de itens da venda

            this.listagemProdutos.add(p.getNome());
            this.listagemUni.add(String.valueOf(UNIDADE_INICIAL));//Arrumar inicialização com constante
            this.listagemSubTotal.add("R$ " + String.valueOf(this.formato.format(UNIDADE_INICIAL_VALOR_REAIS)));//Arrumar inicialização com constante
        }
    }
    
    private void limpaCampos(){
        this.subTotal = 0;
        this.unidades = 0;
        this.venda = new Venda();
        
        this.listagemProdutos.removeAll();
        this.listagemSubTotal.removeAll();
        this.listagemUni.removeAll();
        this.txtNome.setText("");
        this.txtEstoque.setText("");
        this.txtPeso.setText("");
        this.txtSubTot.setText("");
        this.txtPrecoVenda.setText("");
        this.txtValorTotal.setText("");
        this.txtUniTotal.setText("");
        //Determinando minimo, máximo, valor inicial e incremento para a spinner
        SpinnerNumberModel model = new SpinnerNumberModel(UNIDADE_INICIAL, UNIDADE_MINIMO, UNIDADE_MAXIMO, UNIDADE_INCREMENTO);
        this.spnUni.setModel(model);
    }
    
    private void listagemItemMudado(int index) {
        //Variáveis usadas no calculo e exibição do subTotal de um item
        float precoPacote;

        //Pega a posição selecionada na listagem, que é mesma do arrayList de itens do objeto venda e passa para a variável it
        Item it = this.venda.listaItens.get(index);
        //Pega a posição selecionada na listagem, que é mesma do arrayList e passa para a variável p
        Produto p = this.listaProdutos.get(index);

        //Abilita botão cancelar para poder tirar o produto selecionado da compra e seleciona a mesma posição
        //na lista que mostra o numero de unidades escolhidas
        this.btnCancelar.setEnabled(true);

        //Preenche os campos de dados com as informações do produto da venda, com o numero de unidades pedidas 
        this.txtNome.setText(p.getNome());
        this.txtEstoque.setText(String.valueOf(p.getUniEstoque()) + " pacotes");
        this.txtPrecoVenda.setText(String.valueOf(p.getPrecoVenda()));
        this.txtPeso.setText(String.valueOf(p.getPesoUnidade()) + " g");
        this.spnUni.setValue(it.getQnt());

        this.txtSubTot.setText("R$ " + this.formato.format(it.getSubTotal()));
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();
        txtNome = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        txtEstoque = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        spnUni = new javax.swing.JSpinner();
        jLabel3 = new javax.swing.JLabel();
        txtPeso = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        txtSubTot = new javax.swing.JTextField();
        btnConProd = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        jLabel13 = new javax.swing.JLabel();
        txtPrecoVenda = new javax.swing.JTextField();
        lblStatus = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        jLabel5 = new javax.swing.JLabel();
        txtUniTotal = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        txtValorTotal = new javax.swing.JTextField();
        btnCancelaVenda = new javax.swing.JButton();
        btnConfirmaVenda = new javax.swing.JButton();
        jPanel4 = new javax.swing.JPanel();
        jLabel8 = new javax.swing.JLabel();
        txtDia = new javax.swing.JTextField();
        txtMes = new javax.swing.JTextField();
        txtAno = new javax.swing.JTextField();
        jPanel5 = new javax.swing.JPanel();
        listagemUni = new java.awt.List();
        listagemProdutos = new java.awt.List();
        listagemSubTotal = new java.awt.List();
        jLabel9 = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        jLabel11 = new javax.swing.JLabel();

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "PRODUTO SELECIONADO", javax.swing.border.TitledBorder.LEFT, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Calibri", 1, 13))); // NOI18N

        jLabel4.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel4.setText("Produto");

        txtNome.setBackground(new java.awt.Color(153, 153, 153));
        txtNome.setEditable(false);
        txtNome.setFont(new java.awt.Font("Calibri", 0, 13));
        txtNome.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNomeActionPerformed(evt);
            }
        });

        jLabel2.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel2.setText("Estoque (un)");

        txtEstoque.setBackground(new java.awt.Color(153, 153, 153));
        txtEstoque.setEditable(false);
        txtEstoque.setFont(new java.awt.Font("Calibri", 0, 13));
        txtEstoque.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtEstoqueActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel1.setText("Unidades");

        spnUni.setFont(new java.awt.Font("Calibri", 0, 13));
        spnUni.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                spnUniStateChanged(evt);
            }
        });

        jLabel3.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel3.setText("Peso Pacote");

        txtPeso.setBackground(new java.awt.Color(153, 153, 153));
        txtPeso.setEditable(false);
        txtPeso.setFont(new java.awt.Font("Calibri", 0, 13));
        txtPeso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtPesoActionPerformed(evt);
            }
        });

        jLabel6.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel6.setText("SubTotal");

        txtSubTot.setBackground(new java.awt.Color(153, 153, 153));
        txtSubTot.setEditable(false);
        txtSubTot.setFont(new java.awt.Font("Calibri", 0, 13));
        txtSubTot.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtSubTotActionPerformed(evt);
            }
        });

        btnConProd.setFont(new java.awt.Font("Calibri", 0, 13));
        btnConProd.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/prsistema/ImagensIcones/btnConfirmaProd.png"))); // NOI18N
        btnConProd.setText("Confirmar Produto");
        btnConProd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnConProdActionPerformed(evt);
            }
        });

        btnCancelar.setFont(new java.awt.Font("Calibri", 0, 13));
        btnCancelar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/prsistema/ImagensIcones/btnCancelar.png"))); // NOI18N
        btnCancelar.setText("Cancelar");
        btnCancelar.setEnabled(false);
        btnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarActionPerformed(evt);
            }
        });

        jLabel13.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel13.setText("Preço (un)");

        txtPrecoVenda.setFont(new java.awt.Font("Calibri", 0, 13));

        lblStatus.setFont(new java.awt.Font("Calibri", 0, 13)); // NOI18N
        lblStatus.setText("Staus...");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel6)
                            .addComponent(jLabel4)
                            .addComponent(jLabel1)
                            .addComponent(jLabel2))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addComponent(spnUni, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jLabel3)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(txtPeso, javax.swing.GroupLayout.DEFAULT_SIZE, 120, Short.MAX_VALUE))
                            .addComponent(txtNome, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 254, Short.MAX_VALUE)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addComponent(txtEstoque, javax.swing.GroupLayout.DEFAULT_SIZE, 125, Short.MAX_VALUE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel13)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(txtPrecoVenda, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(txtSubTot, javax.swing.GroupLayout.DEFAULT_SIZE, 254, Short.MAX_VALUE)
                            .addComponent(lblStatus, javax.swing.GroupLayout.Alignment.LEADING)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(btnConProd)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE)
                        .addComponent(btnCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 119, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtNome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtEstoque, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtPrecoVenda, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel13)
                    .addComponent(jLabel2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtPeso, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3)
                    .addComponent(spnUni, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addGap(11, 11, 11)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtSubTot, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6))
                .addGap(18, 18, 18)
                .addComponent(lblStatus)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 69, Short.MAX_VALUE)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnConProd)
                    .addComponent(btnCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(""));

        jLabel5.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel5.setText("Unidades Total");

        txtUniTotal.setBackground(new java.awt.Color(153, 153, 153));
        txtUniTotal.setEditable(false);
        txtUniTotal.setFont(new java.awt.Font("Calibri", 0, 13));

        jLabel7.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel7.setText("Total");

        txtValorTotal.setBackground(new java.awt.Color(153, 153, 153));
        txtValorTotal.setEditable(false);
        txtValorTotal.setFont(new java.awt.Font("Calibri", 0, 13));

        btnCancelaVenda.setFont(new java.awt.Font("Calibri", 0, 13));
        btnCancelaVenda.setText("Cancelar");
        btnCancelaVenda.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelaVendaActionPerformed(evt);
            }
        });

        btnConfirmaVenda.setFont(new java.awt.Font("Calibri", 0, 13));
        btnConfirmaVenda.setText("Confirmar Compra");

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel5)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txtUniTotal, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel7)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txtValorTotal, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 52, Short.MAX_VALUE)
                .addComponent(btnCancelaVenda, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnConfirmaVenda)
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel5)
                    .addComponent(txtUniTotal, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel7)
                    .addComponent(txtValorTotal, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnConfirmaVenda, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnCancelaVenda, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "INFORMAÇÕES DE VENDA", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Calibri", 1, 13))); // NOI18N

        jLabel8.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel8.setText("Data");

        txtDia.setFont(new java.awt.Font("Calibri", 0, 13));

        txtMes.setFont(new java.awt.Font("Calibri", 0, 13));

        txtAno.setFont(new java.awt.Font("Calibri", 0, 13));

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel8)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txtDia, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txtMes, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txtAno, javax.swing.GroupLayout.PREFERRED_SIZE, 53, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(501, Short.MAX_VALUE))
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel8)
                    .addComponent(txtDia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtMes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtAno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "LISTA DE PRODUTOS DE VENDA", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Calibri", 1, 13))); // NOI18N
        jPanel5.setFont(new java.awt.Font("Calibri", 0, 13));

        listagemUni.setFont(new java.awt.Font("Calibri", 0, 13));
        listagemUni.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                listagemUniItemStateChanged(evt);
            }
        });

        listagemProdutos.setFont(new java.awt.Font("Calibri", 0, 13));
        listagemProdutos.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                listagemProdutosItemStateChanged(evt);
            }
        });

        listagemSubTotal.setFont(new java.awt.Font("Calibri", 0, 13));
        listagemSubTotal.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                listagemSubTotalItemStateChanged(evt);
            }
        });

        jLabel9.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel9.setText("Uni");

        jLabel10.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel10.setText("Produtos");

        jLabel11.setFont(new java.awt.Font("Calibri", 0, 13));
        jLabel11.setText("SubTotal");

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(listagemUni, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel9))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(listagemProdutos, javax.swing.GroupLayout.PREFERRED_SIZE, 211, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel10))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel11)
                    .addComponent(listagemSubTotal, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel10)
                    .addComponent(jLabel11)
                    .addComponent(jLabel9))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(listagemProdutos, javax.swing.GroupLayout.DEFAULT_SIZE, 261, Short.MAX_VALUE)
                    .addComponent(listagemUni, javax.swing.GroupLayout.DEFAULT_SIZE, 261, Short.MAX_VALUE)
                    .addComponent(listagemSubTotal, javax.swing.GroupLayout.DEFAULT_SIZE, 261, Short.MAX_VALUE))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jPanel4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

private void spnUniStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_spnUniStateChanged
    try {
        int index = this.listagemProdutos.getSelectedIndex();
        
        unidades = Long.parseLong(this.spnUni.getValue().toString()); //Pegando valor do spinner
        float precoPacote = Float.parseFloat(txtPrecoVenda.getText()); //Pegando preço do pacote
        subTotal = (float) unidades * precoPacote; //calculando o subtotal do produto
        
        this.txtSubTot.setText("R$ " + formato.format(subTotal)); //mostrando o subtotal do produto no formaro 0,00
    } catch (NumberFormatException ex) {
        JOptionPane.showMessageDialog(null, "Informe o preço do pacote");
    } catch (ArrayIndexOutOfBoundsException ex) {
        JOptionPane.showMessageDialog(null, "Selecione um produto primeiro");
    } catch (Exception ex) {
        JOptionPane.showMessageDialog(null, "" + ex);
    }
}//GEN-LAST:event_spnUniStateChanged

private void btnConProdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnConProdActionPerformed
    try {
        int index = this.listagemProdutos.getSelectedIndex();//Pegando a posição do produto na listagem
        Item it = new Item();
        it = this.venda.listaItens.get(index);

        //Comparação para que não sejam pedidos mais produtos do que o disponivel em estoque
        if (unidades <= this.listaProdutos.get(index).getUniEstoque()) { 
            
            //Atualizando os novos valores para o valor total e numero total de itens de venda
            this.venda.atualizaNumItens(unidades - it.getQnt());
            this.venda.atualizaValorTotal(subTotal - it.getSubTotal());

            //Atualizando valores de unidade e subtotal do produto confirmado
            it.setQnt(unidades);
            it.setSubTotal(subTotal);

            //Mostrando os novos valores de unidade e subtotal do produto confirmado
            //Também atualizando o valor total e o numero total de itens
            this.txtUniTotal.setText(String.valueOf(this.venda.getNumItens()));
            this.txtValorTotal.setText("R$ " + this.formato.format(this.venda.getValorTotal()));
            this.listagemUni.replaceItem(String.valueOf(unidades), index);
            this.listagemSubTotal.replaceItem("R$ " + this.formato.format(subTotal), index);

            //Selecionando novamente a posição escolhida nas lista de unidades e subtotal
            //Pois quando os valores são substituidos, o a lista fica sem nenhum item selecionado
            this.listagemUni.select(index);
            this.listagemSubTotal.select(index);

            MetodosStaticos.mudaJlabel(this.lblStatus, "Produto Confirmado", Color.GREEN, 
                    new ImageIcon(getClass().getResource(urlLabelIcon + "lblConfirma.png")));
        } else {
            MetodosStaticos.mudaJlabel(this.lblStatus, "Não há produtos suficiente em estoque", Color.red, 
                    new ImageIcon(getClass().getResource(urlLabelIcon + "lblErro.png")));
        }
    } catch (ArrayIndexOutOfBoundsException ex) {
        MetodosStaticos.mudaJlabel(this.lblStatus, "Selecione um produto primeiro", 
                Color.red, new ImageIcon(getClass().getResource(urlLabelIcon + "lblErro.png")));
    } catch (Exception ex) {
        JOptionPane.showMessageDialog(null, ex);
    }
    //NÃO ESQUECER DE SETTAR O ID DA VENDA
}//GEN-LAST:event_btnConProdActionPerformed

private void listagemProdutosItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_listagemProdutosItemStateChanged
    //Pega a posição selecionada na listagem, que é mesma do arrayList e seleciona o mesmo indice 
    //das outras listas
    int index = this.listagemProdutos.getSelectedIndex();
    this.listagemUni.select(index);
    this.listagemSubTotal.select(index);

    this.listagemItemMudado(index); //Método que exibe os dados do produto selecionado nos campos
}//GEN-LAST:event_listagemProdutosItemStateChanged

private void listagemUniItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_listagemUniItemStateChanged
    //Pega a posição selecionada na listagem, que é mesma do arrayList e seleciona o mesmo indice 
    //das outras listas
    int index = this.listagemUni.getSelectedIndex();
    this.listagemProdutos.select(index);
    this.listagemSubTotal.select(index);

    this.listagemItemMudado(index); //Método que exibe os dados do produto selecionado nos campos
}//GEN-LAST:event_listagemUniItemStateChanged

private void txtEstoqueActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtEstoqueActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_txtEstoqueActionPerformed

private void listagemSubTotalItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_listagemSubTotalItemStateChanged
    //Pega a posição selecionada na listagem, que é mesma do arrayList e seleciona o mesmo indice 
    //das outras listas
    int index = this.listagemSubTotal.getSelectedIndex();
    this.listagemUni.select(index);
    this.listagemProdutos.select(index);

    this.listagemItemMudado(index); //Método que exibe os dados do produto selecionado nos campos
}//GEN-LAST:event_listagemSubTotalItemStateChanged

private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarActionPerformed
    try {
        int index = this.listagemProdutos.getSelectedIndex();//Pegando a posição do produto na listagem
        unidades = 0; // Pegando valor do spinner
        subTotal = 0; //Pegando Valor do subtotal

        Item it = new Item();
        it = this.venda.listaItens.get(index);

        //Atualizando os novos valores para o valor total e numero total de itens de venda
        this.venda.atualizaNumItens(unidades - it.getQnt());
        this.venda.atualizaValorTotal(subTotal - it.getSubTotal());

        //Atualizando valores de unidade e subtotal do produto confirmado
        it.setQnt(unidades);
        it.setSubTotal(subTotal);

        //Mostrando os novos valores de unidade e subtotal do produto confirmado
        //Também atualizando o valor total e o numero total de itens
        this.txtUniTotal.setText(String.valueOf(this.venda.getNumItens()));
        this.txtValorTotal.setText("R$ " +this.formato.format(this.venda.getValorTotal()));
        this.listagemUni.replaceItem(String.valueOf(unidades), index);
        this.listagemSubTotal.replaceItem("R$ " +this.formato.format(subTotal), index);

        //Selecionando novamente a posição escolhida nas lista de unidades e subtotal
        //Pois quando os valores são substituidos, o a lista fica sem nenhum item selecionado
        this.listagemUni.select(index);
        this.listagemSubTotal.select(index);

    } catch (ArrayIndexOutOfBoundsException ex) {
        JOptionPane.showMessageDialog(null, "Selecione algum produto primeiro");
    } catch (Exception ex) {
        JOptionPane.showMessageDialog(null, ex);
    }
}//GEN-LAST:event_btnCancelarActionPerformed

private void txtNomeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtNomeActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_txtNomeActionPerformed

private void txtSubTotActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtSubTotActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_txtSubTotActionPerformed

private void txtPesoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtPesoActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_txtPesoActionPerformed

private void btnCancelaVendaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelaVendaActionPerformed
    int opt = JOptionPane.showConfirmDialog(null, "Deseja mesmos cancelar esta venda ?");
    
    if(opt == 0){
        this.venda = new Venda();
        this.carregarProdutos();
    }
}//GEN-LAST:event_btnCancelaVendaActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnCancelaVenda;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnConProd;
    private javax.swing.JButton btnConfirmaVenda;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JLabel lblStatus;
    private java.awt.List listagemProdutos;
    private java.awt.List listagemSubTotal;
    private java.awt.List listagemUni;
    private javax.swing.JSpinner spnUni;
    private javax.swing.JTextField txtAno;
    private javax.swing.JTextField txtDia;
    private javax.swing.JTextField txtEstoque;
    private javax.swing.JTextField txtMes;
    private javax.swing.JTextField txtNome;
    private javax.swing.JTextField txtPeso;
    private javax.swing.JTextField txtPrecoVenda;
    private javax.swing.JTextField txtSubTot;
    private javax.swing.JTextField txtUniTotal;
    private javax.swing.JTextField txtValorTotal;
    // End of variables declaration//GEN-END:variables
}
